查看原文
其他

Titanium系列视频08 | 示例DApp:Basic DAO

ICPL 2022-06-10


By Ryan Stout


本期概要

本期以一个 DApp Basic DAO 为范例,介绍了社区用户如何在 DApp 中实现提案权、投票权,以及此类 DApp 的基本运行方式。



Basic DAO 是一个基本的 DAO 或基本的去中心化自治组织。它的目的是展示互联网计算机支持用户社区的能力,用户们可以以一种民主的方式团结起来共同采取行动。

这个实例 DApp 现在是开源的,你可以在 github 上的 dfinity/examples 仓库中找到它,它在 rust / basic_dao / 目录下。



这是一个 DApp,也是一个在 rust 中开发的单个容器,它的实现非常简单。Demo 有两个主要组件:其中一个将用户和他们控制的代币数量映射在一起,用户可以在互相转移代币,还可以查看他们的余额;另一个是提案组件,用户可以提交提议使用任意方法和参数调用任意容器的提案,他们有很高的自由度

社区的用户在某 DApp 中,可以使用他们的代币作为投票权对这些提案进行投票,以决定他们希望提案通过还是被拒绝。你拥有的代币数量与你对提案的投票数量一一对应。一旦提案获得足够的票数通过,这个提议使用这个方法和一些参数调用容器这个操作将被执行,然后这个 Basic DAO 容器将按照提案的要求调用另一个容器。

Github 上的这个 README 文件包含一个 demo,详细说明了我们如何使用这些组件,如何获得代币和转移代币,以及如何提交提案、对它们进行投票并见证它的运作方式。





 初始化用户


你克隆这个仓库并且进入正确的目录后,我们可以构建容器,这不会花费太长时间。然后在另一个tab中,我们需要执行“dfx start”,它的作用是在本地或 ic 上运行互联网计算机。然后我们可以将我们的容器部署到本地运行的互联网计算机上。

但首先这需要用户,我们需要创建测试用户Alice和Bob。



复制这些命令,我们就创建了Alice 和 Bob。我们最后创建了 Bob,所以我们当前以 Bob 的身份执行命令,Bob 是我们当前配置的身份。现在我们将 basic DAO 容器部署到我们本地运行的互联网计算机上。我们可以使用这个命令,这里有一些你可以传递的初始化参数,你可以列出你想要的所有帐户。



我们要做的是初始化有一些代币的 Alice 和 Bob。代币是以 e8s 计算的,就是10^(-8),这样就可以用更细的粒度细分代币。所以这里的 1 亿实际上是 10 个代币。我们还传递了一些系统参数。这个transfer_fee是当你从一个用户向另一个用户转移代币时,你想向用户收取的费用。其他一些参数也可以在这里设置。

接下来让我们部署这个 basic DAO 容器,它将部署到我们本地运行的互联网计算机上。这不会花费太长时间。

下一步是在basic DAO 容器上调用“ list accounts ”方法,这将列出此容器中的所有帐户。

现在我们已经部署好了,我们调用了“ list_accounts ”方法。可以看到有两个帐户,一个是 Alice,一个是 Bob。Principal 是这些用户的用户 ID,他们都有 10 个代币。



任何用户都可以运行“list_accounts”方法, 但是作为 Bob,我还可以检查自己的帐户余额,因为这是 dfx 正在使用的身份。我们可以看到我确实有 10 个代币。




 转移代币


我可以将这些代币转移给Alice。



我们调用“transfer”方法,设置一个目标用户 Alice 和一个金额,我们将给她九个代币。执行成功之后,我们可以再次列出帐户。



我们可以看到,一个账户正好增长了 9 个代币,而 Bob 消耗了 9 个代币。这里不是消耗了正好9个代币, 并且这里还有一笔转移手续费。




 提交提案


也许我们觉得相互之间转移代币的转移手续费太高,所以作为一个社区,我们希望齐心协力改变这种状况。这就是提案功能的用武之地。

如果我们想知道当前的转移费是多少,我们可以调用 “get system parameters”方法。



我们可以看到转移费是 10,000 e8s,然后是提案投票阈值,即通过提案需要多少票,现在这相当于一个代币或 10,000,000 e8s。下一个是提案提交押金,它也是 10000 e8s。这是为了阻止人们提交多余的提案。提案是免费的,就会导致任何人都可以提交很多提案,给社区刷屏。在这里,提交提案的时候必须提交押金,你必须拥有这么多代币,并且在提案被执行之前,这些代币会从你的账户中扣留。如果提案获得通过,这些代币会返还给你;提案被拒绝,那么你会损失这些代币。这样来激励人们提交高质量的提案。

但我们只关心转移费,我们想改变转移费,也许我们认为它太低了,不想让人们在转移代币时想太多,所以让我们提出一个转移费加倍的提案。

在Demo中,有ProposalPayload。提交提案时,我们需要提交一个容器 ID,即我们要调用的容器、我们要在该容器中调用的方法以及我们要传递给该方法的message、参数或函数。



如果我们想更改 basic DAO 容器上的转移费,我们需要调用“update_system_params”方法,并设置这个容器上新的转移费。因为这个ProposalPayload中的message是一个 blob,我们需要将转移费转换为 blob 或基本字节。有一个名为 didc 的工具可以执行这个操作,它是容器工具链上的一部分,有关如何使用它的说明在这个README文件中有,大家自行查阅。

我将转移费更改为 20000 e8s,也就是将其翻倍。我们需要将其转换为二进制。现在我们可以构建我们的提案。

我们将在basic DAO容器上使用“submit_proposal”方法。



这里的canister_id 将是我们安装的basic DAO的容器 ID,也就是我们部署它时,它输出的那个容器 ID。这里我们用的方法是“update_system_params”, message是我们刚刚创建的这个二进制编码的 blob,它的内容是将转移费设置为 20000。

我们运行这个命令,会得到一个提案ID。所以这个0是我们刚刚提交的提案的ID。

如果想查看这个提案的元数据,我们可以把提案ID输进去,调用 “get_proposal”。这应该会输出一些元数据,可以看到 ID是零、对这个提案投反对票的票数、还列出了所有对此投票的选民,以及状态。这个提案仍然是开放的;一旦投了足够多的“是”或“否”,它就会转为采用或拒绝而不再开放。这里还列出了一个时间戳,表明它何时被提交给提议者、赞成票的数量和实际d的有效载荷。





对提案进行投票


一旦提案被提交,我们就可以对其进行投票。dfx 正在使用的身份是 Bob,作为Bob,我们可以对此投票。让我们试试投赞成票。 



投票通过了,可以看到状态仍然是开放的。Bob 没有足够的代币来投票,所以这个提案还无法通过,我们需要其他用户对此提案进行投票。我们可以将身份切换为 Alice,并以 Alice 的身份投票以通过提案。我们将切换到 Alice,然后我们将作为Alice调用 vote 并且投赞成票。 



我们可以看到返回的提案状态不再是开放了,而是Accept,这意味着已经有足够多的票来通过该提案了。一旦提案被接受,basic DAO 容器本身就会自动执行该提案。因此它将使用之前传入的方法和参数调用该容器ID。

我们再次获取提案元数据,可以看到它已经成功执行了,有两个人对此进行了投票,赞成票的数量是准确的。



再让我们确认一下它是否已经成功。调用 “get_system_params”,我们可以看到转移费已经从10000更新到20000了。



回顾一下,我们可以看到,这个basic DAO 容器使用户社区能够持有和转移代币,还可以提交和投票表决那些将会执行社区意愿的提案。

希望这能为那些想在互联网计算机上构建 DAOs 的人提供启发。我们期待看到您使用它构建的内容。谢谢。




小助手微信号

入群请添加

联系我们

ICPL 官网

https://icpl.app

ICPL Twitter

https://twitter.com/icpleague_com

ICPL Medium

https://medium.com/icp-league

ICPL Telegram

 https://t.me/ICPL_en

ICPL 论坛

 https://icpleague.com



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存